
#ifndef Debug_H
#define Debug_H

// CSharp includes.
#include <Typedef.h>
#include <CSharpPropertyMethods.h>
#include <Defines.h>

#include <System/String.h>

namespace Riccsson
{
	namespace System
	{
		namespace Diagnostics
		{
			// Summary:
			//     Provides a set of methods and properties that help debug your code. This
			//     class cannot be inherited.
			class Debug sealed
			{
				STATIC_CLASS(Debug)

				// Summary:
				//     Gets or sets a value indicating whether System.Diagnostics.Debug.Flush()
				//     should be called on the System.Diagnostics.Debug.Listeners after every write.
				//
				// Returns:
				//     true if System.Diagnostics.Debug.Flush() is called on the System.Diagnostics.Debug.Listeners
				//     after every write; otherwise, false.
				//public: static bool AutoFlush { get; set; }
				//
				// Summary:
				//     Gets or sets the indent level.
				//
				// Returns:
				//     The indent level. The default is 0.
				//public: static int IndentLevel { get; set; }
				//
				// Summary:
				//     Gets or sets the number of spaces in an indent.
				//
				// Returns:
				//     The number of spaces in an indent. The default is four.
				//public: static int IndentSize { get; set; }
				//
				// Summary:
				//     Gets the collection of listeners that is monitoring the debug output.
				//
				// Returns:
				//     A System.Diagnostics.TraceListenerCollection representing a collection of
				//     type System.Diagnostics.TraceListener that monitors the debug output.
				//public: static TraceListenerCollection Listeners { get; }

				// Summary:
				//     Checks for a condition; if the condition is false, displays a message box
				//     that shows the call stack.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, a failure
				//     message is not sent and the message box is not displayed.
				//[Conditional("DEBUG")]
				public: static void Assert(bool condition);
				//
				// Summary:
				//     Checks for a condition; if the condition is false, outputs a specified message
				//     and displays a message box that shows the call stack.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the specified
				//     message is not sent and the message box is not displayed.
				//
				//   message:
				//     The message to send to the System.Diagnostics.Trace.Listeners collection.
				//[Conditional("DEBUG")]
				public: static void Assert(bool condition, string* message);
				//
				// Summary:
				//     Checks for a condition; if the condition is false, outputs two specified
				//     messages and displays a message box that shows the call stack.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the specified
				//     messages are not sent and the message box is not displayed.
				//
				//   message:
				//     The message to send to the System.Diagnostics.Trace.Listeners collection.
				//
				//   detailMessage:
				//     The detailed message to send to the System.Diagnostics.Trace.Listeners collection.
				//[Conditional("DEBUG")]
				public: static void Assert(bool condition, string* message, string* detailMessage);
				//
				// Summary:
				//     Checks for a condition; if the condition is false, outputs two messages (simple
				//     and formatted) and displays a message box that shows the call stack.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the specified
				//     messages are not sent and the message box is not displayed.
				//
				//   message:
				//     The message to send to the System.Diagnostics.Trace.Listeners collection.
				//
				//   detailMessageFormat:
				//     The composite format string* (see Remarks) to send to the System.Diagnostics.Trace.Listeners
				//     collection. This message contains text intermixed with zero or more format
				//     items, which correspond to objects in the args array.
				//
				//   args:
				//     An object array that contains zero or more objects to format.
				//[Conditional("DEBUG")]
				public: static void Assert(bool condition, string* message, string* detailMessageFormat, Array<object>* args);
				//
				// Summary:
				//     Flushes the output buffer and then calls the Close method on each of the
				//     System.Diagnostics.Debug.Listeners.
				//[Conditional("DEBUG")]
				public: static void Close();
				//
				// Summary: string* 
				//     Emits the specified error message.
				//
				// Parameters:
				//   message:
				//     A message to emit.
				//[Conditional("DEBUG")]
				public: static void Fail(string* message);
				//
				// Summary:
				//     Emits an error message and a detailed error message.
				//
				// Parameters:
				//   message:
				//     A message to emit.
				//
				//   detailMessage:
				//     A detailed message to emit.
				//[Conditional("DEBUG")]
				public: static void Fail(string* message, string* detailMessage);
				//
				// Summary:
				//     Flushes the output buffer and causes buffered data to write to the System.Diagnostics.Debug.Listeners
				//     collection.
				//[Conditional("DEBUG")]
				public: static void Flush();
				//
				// Summary:
				//     Increases the current System.Diagnostics.Debug.IndentLevel by one.
				//[Conditional("DEBUG")]
				public: static void Indent();
				//
				// Summary:
				//     Writes a message followed by a line terminator to the trace listeners in
				//     the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   message:
				//     The message to write.
				//[Conditional("DEBUG")]
				public: static void Print(string* message);
				//
				// Summary:
				//     Writes a formatted string* followed by a line terminator to the trace listeners
				//     in the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   format:
				//     A composite format string* (see Remarks) that contains text intermixed with
				//     zero or more format items, which correspond to objects in the args array.
				//
				//   args:
				//     An object array containing zero or more objects to format.
				//
				// Exceptions:
				//   System.ArgumentNullException:
				//     format is null.
				//
				//   System.FormatException:
				//     format is invalid.-or- The number that indicates an argument to format is
				//     less than zero, or greater than or equal to the number of specified objects
				//     to format.
				//[Conditional("DEBUG")]
				public: static void Print(string* format, Array<object>* args);
				//
				// Summary:
				//     Decreases the current System.Diagnostics.Debug.IndentLevel by one.
				//[Conditional("DEBUG")]
				public: static void Unindent();
				//
				// Summary:
				//     Writes the value of the object's System.Object.ToString() method to the trace
				//     listeners in the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//[Conditional("DEBUG")]
				public: static void Write(object* value);
				//
				// Summary:
				//     Writes a message to the trace listeners in the System.Diagnostics.Debug.Listeners
				//     collection.
				//
				// Parameters:
				//   message:
				//     A message to write.
				//[Conditional("DEBUG")]
				public: static void Write(string* message);

				//
				// Summary:
				//     Writes a category name and the value of the object's System.Object.ToString()
				//     method to the trace listeners in the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void Write(object* value, string* category);
				//
				// Summary:
				//     Writes a category name and message to the trace listeners in the System.Diagnostics.Debug.Listeners
				//     collection.
				//
				// Parameters:
				//   message:
				//     A message to write.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void Write(string* message, string* category);
				//
				// Summary:
				//     Writes the value of the object's System.Object.ToString() method to the trace
				//     listeners in the System.Diagnostics.Debug.Listeners collection if a condition
				//     is true.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the value
				//     is written to the trace listeners in the collection.
				//
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//[Conditional("DEBUG")]
				public: static void WriteIf(bool condition, object* value);
				//
				// Summary:
				//     Writes a message to the trace listeners in the System.Diagnostics.Debug.Listeners
				//     collection if a condition is true.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the message
				//     is written to the trace listeners in the collection.
				//
				//   message:
				//     A message to write.
				//[Conditional("DEBUG")]
				public: static void WriteIf(bool condition, string* message);
				//
				// Summary:
				//     Writes a category name and the value of the object's System.Object.ToString()
				//     method to the trace listeners in the System.Diagnostics.Debug.Listeners collection
				//     if a condition is true.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the category
				//     name and value are written to the trace listeners in the collection.
				//
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void WriteIf(bool condition, object value, string* category);
				//
				// Summary:
				//     Writes a category name and message to the trace listeners in the System.Diagnostics.Debug.Listeners
				//     collection if a condition is true.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the category
				//     name and message are written to the trace listeners in the collection.
				//
				//   message:
				//     A message to write.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void WriteIf(bool condition, string* message, string* category);
				//
				// Summary:
				//     Writes the value of the object's System.Object.ToString() method to the trace
				//     listeners in the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//[Conditional("DEBUG")]
				public: static void WriteLine(object* value);
				//
				// Summary:
				//     Writes a message followed by a line terminator to the trace listeners in
				//     the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   message:
				//     A message to write.
				//[Conditional("DEBUG")]
				public: static void WriteLine(string* message);
				//
				// Summary:
				//     Writes a category name and the value of the object's System.Object.ToString()
				//     method to the trace listeners in the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void WriteLine(object* value, string* category);
				//
				// Summary:
				//     Writes a formatted message followed by a line terminator to the trace listeners
				//     in the System.Diagnostics.Debug.Listeners collection.
				//
				// Parameters:
				//   format:
				//     A composite format string* (see Remarks) that contains text intermixed with
				//     zero or more format items, which correspond to objects in the args array.
				//
				//   args:
				//     An object array that contains zero or more objects to format.
				//[Conditional("DEBUG")]
				public: static void WriteLine(string* format, Array<object>* args);
				//
				// Summary:
				//     Writes a category name and message to the trace listeners in the System.Diagnostics.Debug.Listeners
				//     collection.
				//
				// Parameters:
				//   message:
				//     A message to write.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void WriteLine(string* message, string* category);
				//
				// Summary:
				//     Writes the value of the object's System.Object.ToString() method to the trace
				//     listeners in the System.Diagnostics.Debug.Listeners collection if a condition
				//     is true.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the value
				//     is written to the trace listeners in the collection.
				//
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//[Conditional("DEBUG")]
				public: static void WriteLineIf(bool condition, object* value);
				//
				// Summary:
				//     Writes a message to the trace listeners in the System.Diagnostics.Debug.Listeners
				//     collection if a condition is true.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the message
				//     is written to the trace listeners in the collection.
				//
				//   message:
				//     A message to write.
				//[Conditional("DEBUG")]
				public: static void WriteLineIf(bool condition, string* message);
				//
				// Summary:
				//     Writes a category name and the value of the object's System.Object.ToString()
				//     method to the trace listeners in the System.Diagnostics.Debug.Listeners collection
				//     if a condition is true.
				//
				// Parameters:
				//   condition:
				//     The conditional expression to evaluate. If the condition is true, the category
				//     name and value are written to the trace listeners in the collection.
				//
				//   value:
				//     An object whose name is sent to the System.Diagnostics.Debug.Listeners.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void WriteLineIf(bool condition, object* value, string* category);
				//
				// Summary:
				//     Writes a category name and message to the trace listeners in the System.Diagnostics.Debug.Listeners
				//     collection if a condition is true.
				//
				// Parameters:
				//   condition:
				//     true to cause a message to be written; otherwise, false.
				//
				//   message:
				//     A message to write.
				//
				//   category:
				//     A category name used to organize the output.
				//[Conditional("DEBUG")]
				public: static void WriteLineIf(bool condition, string* message, string* category);

				//public: static void WriteLine(const char* message);
				public: static void WriteLine(const string& message);
			};
		}
	}
}

#endif